Как сделать ImageView видимым и невидимым при нажатии строки ListView в Android?
У меня есть ListView
который генерируется с использованием SimpleAdapter
У меня есть текстовое представление и изображение в XML-файле, который используется с SimpleAdapter. Поначалу imageview устанавливается как невидимое. При щелчке строки в представлении списка вид из окна становится видимым. Я хочу сделать следующее:
Если у меня есть 4 строки в ListView, и если я щелкаю строку 1, то ImageView должен быть виден в строке 1, тогда, если я щелкаю строку 2, представление изображения должно стать невидимым из строки 1 и должно быть видно только в строке 2.
Я сделал следующее, но это работает следующим образом:
Если я нажму на строку 1, ImageView будет виден на строке 1. Затем, если я щелкну строку 2, ImageView станет видимым в строке 2, а также в строке 1. Я хочу сделать его невидимым для m row1 и отображать его только в строке, по которой щелкнули.
Может кто-нибудь шаг за шагом направить меня, как это сделать. Мои коды и XML, как показано ниже:
myactivity.class
final ListAdapter k=new SimpleAdapter(getActivity(),val,R.layout.senttaskdata2,new String[]{"rname"},new int[]{R.id.textView1})
{
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final View v = super.getView(position, convertView, parent);
ImageView im=(ImageView)v.findViewById(R.id.ImageView3);
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
ImageView im=(ImageView)arg1.findViewById(R.id.ImageView3);
setVisibility(arg1.VISIBLE);
});
return v;
}
};
sent.setAdapter(k);
senttaskdata2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="70dp"
android:background="@android:color/transparent" >
<ImageView
android:id="@+id/imageView3"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="8dp"
android:src="@drawable/test2" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView2"
android:layout_below="@+id/textView2"
android:text="TextView"
android:textColor="@android:color/darker_gray"
android:textSize="11sp" />
</RelativeLayout>
</LinearLayout>
2 ответа
У меня та же проблема, и я нашел простой способ сделать это.
Во-первых, в вашем собственном адаптере
public class MyAdapter extends BaseAdapter {
private int selectedIndex;
private boolean visible;
// omitted code
}
// omitted code
public View getView(int index, View view, ViewGroup parent) {
TextView textView= (TextView) view.findViewById(R.id.text_view);
ImageView imgView = (ImageView) view.findViewById(R.id.image_view);
textView.setText("some text");
if(index == selectedIndex) {
imgView .setVisibility(View.VISIBLE);
} else {
imgView .setVisibility(View.INVISIBLE);
}
return view;
}
Во-вторых, в вашей деятельности
public void onCreate(Bundle bundle) {
// omitted code
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view,
int position, long id) {
// change index of selected item
fontAdapter.setSelectedIndex(position);
fontAdapter.notifyDataSetChanged();
}
});
// omitted code
}
Попробуйте это, я реализовал свой собственный адаптер вместо простого адаптера
ListAdapter.java
package com.stackru.listviewanswer;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class ListAdapter extends BaseAdapter
{
private boolean[] mVisibilityList = null;
private String[] mNameList = null;
private Context mContext = null;
private LayoutInflater mInflater = null;
public ListAdapter(Context iContext, boolean[] iVisibilityList, String[] iNameList)
{
mVisibilityList = iVisibilityList;
mContext = iContext;
mInflater = LayoutInflater.from(mContext);
mNameList = iNameList;
}
public void setVisibilityList(boolean[] iVisibilityList)
{
mVisibilityList = iVisibilityList;
}
@Override
public int getCount()
{
return mVisibilityList.length;
}
@Override
public Object getItem(int iPosition)
{
return mVisibilityList[iPosition];
}
@Override
public long getItemId(int iPosition)
{
return iPosition;
}
@Override
public View getView(int iPosition, View iConvertView, ViewGroup iViewGroup)
{
Holder holder = new Holder();
if (iConvertView == null)
{
iConvertView = mInflater.inflate(R.layout.list, null);
holder.mImageView = (ImageView) iConvertView.findViewById(R.id.imageView3);
holder.mTextView = (TextView) iConvertView.findViewById(R.id.textView1);
iConvertView.setTag(holder);
}
else
{
holder = (Holder) iConvertView.getTag();
}
// SET DATA
if (mVisibilityList[iPosition])
{
holder.mImageView.setVisibility(View.VISIBLE);
}
else
{
holder.mImageView.setVisibility(View.INVISIBLE);
// OR
// holder.mImageView.setVisibility(View.GONE);
// Use as per your needs
}
holder.mTextView.setText(mNameList[iPosition]);
return iConvertView;
}
private class Holder
{
TextView mTextView = null;
ImageView mImageView = null;
}
}
MainActivity.java
package com.stackru.listviewanswer;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
public class MainActivity extends Activity implements OnItemClickListener
{
ListView mListView = null;
boolean[] mVisisbilityList = { false, false, false, false };
String[] mNameList = { "TextView 1", "TextView 2", "TextView 3", "TextView 4" };
ListAdapter adapter = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.list_view);
mListView.setOnItemClickListener(this);
adapter = new ListAdapter(this, mVisisbilityList, mNameList);
mListView.setAdapter(adapter);
}
@Override
public void onItemClick(AdapterView<?> iAdapterView, View iView, int iPosition, long iId)
{
for (int i = 0; i < 4; i++)
{
mVisisbilityList[i] = false;
}
mVisisbilityList[iPosition] = true;
adapter.setVisibilityList(mVisisbilityList);
adapter.notifyDataSetChanged();
}
}
list.xml совпадает с вашим senttaskdata2.xml