4

在我的应用程序中,我只是使用列表视图来显示图像和文本。这是我的适配器编码

ArrayAdapter<String> adapter=new ArrayAdapter<String>(MainActivity.this, R.layout.list_item, R.id.name, arrList);

    listProductCategories.setAdapter(adapter);

    listProductCategories.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

              ImageView imgview = (ImageView) view.findViewById(R.id.iv_listitem);
                 //And change its background here
                 imgview.setBackgroundResource(R.drawable.fail);

            String name = ((TextView) view.findViewById(R.id.name))
                    .getText().toString();
            Toast.makeText(MainActivity.this, "" + name, 10).show();

        }
    });

这是上面编码的屏幕截图。

在此处输入图像描述

在这里,我突出显示了选定的列表项。但我的输出显示了许多列表视图项图像背景中的一些更改。

请给我一个解决方案....

<ImageView android:id="@+id/iv_listitem" 
android:layout_width="20dp" 
android:layout_height="20dp" 
android:layout_gravity="center_vertical" 
android:background="@drawable/next_unselect"
android:focusable="false" /> 
<TextView
android:id="@+id/name" 
android:layout_width="match_parent"   
android:layout_height="wrap_content" 
android:layout_gravity="center_vertical"
android:focusable="false" 
android:text="TextView"
android:textColor="#003366" /> 

项目清单-

  <ImageView android:id="@+id/iv_listitem" android:layout_width="20dp" android:layout_height="20dp" android:layout_gravity="center_vertical" android:background="@drawable/next_unselect" android:focusable="false" />

  <TextView android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:focusable="false" android:text="TextView" android:textColor="#003366" />
4

2 回答 2

6

我使用了带有自定义适配器的自定义 ListView 和带有 getter 和 setter 的 ItemsHolder 类。

改变

  1. 获取项目的位置。
  2. 更改该位置的项目。
  3. 调用notifyDataSetChanged()您的适配器以刷新列表视图。

例子:

ItemsHolder ih = hold.get(position);
ih.setImage(decodeImage(R.drawable.appicon));
ih.setName("Changed");
cus.notifyDataSetChanged();

测试.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"

tools:context=".MenuActivity" >

<ListView
    android:id="@+id/listView_Menu"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

</ListView>
</RelativeLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ImageView
    android:id="@+id/imageView_List_Item"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:contentDescription="@string/app_name"
    android:src="@drawable/ic_launcher" />

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/imageView_List_Item"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="28dp"
    android:text="TextView" />

</RelativeLayout>

MainActivity.java

public class MainActivity extends Activity {
ArrayList<ItemsHolder> hold= new ArrayList<ItemsHolder>();
CustomAdapter cus;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);
    Bitmap[] images = {decodeImage(R.drawable.ic_launcher),decodeImage(R.drawable.ic_launcher)};
    ListView list = (ListView)findViewById(R.id.listView_Menu);
    hold.add(new ItemsHolder(images[0],"image1"));
    hold.add(new ItemsHolder(images[1],"image2"));
     cus = new CustomAdapter(hold);
     list.setAdapter(cus);
     list.setOnItemClickListener(new OnItemClickListener()
     {
         public void onItemClick(AdapterView<?> parent, View
                 view, int position, long id)
         {
                ItemsHolder ih = hold.get(position);
                ih.setImage(decodeImage(R.drawable.appicon));
                ih.setName("Changed");
                cus.notifyDataSetChanged();

         }
     });

}
private Bitmap decodeImage(int res) {
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),res);               
    return bitmap;      
}
class ItemsHolder
{
    Bitmap image;
    String name;
    public ItemsHolder(Bitmap bitmap, String string) {
        // TODO Auto-generated constructor stub
        image = bitmap;
        name =string;
    }
    public Bitmap getImage() {
        return image;
    }
    public void setImage(Bitmap image) {
        this.image = image;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}
class CustomAdapter extends BaseAdapter
{

    LayoutInflater inflater;
    ArrayList<ItemsHolder> list;
    public CustomAdapter(ArrayList<ItemsHolder> list)
    {
        this.list=list;
        inflater= LayoutInflater.from(MainActivity.this);

    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }
    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder;
        if(convertView==null)
        {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.list_item, null);
            holder.iv= (ImageView) convertView.findViewById(R.id.imageView_List_Item);
            holder.tv = (TextView) convertView.findViewById(R.id.textView1);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder)convertView.getTag();
        }
        ItemsHolder ih = list.get(position);
        holder.iv.setImageBitmap(ih.getImage());
        holder.tv.setText(ih.getName());
        return convertView;
    }

}
class ViewHolder
{
    ImageView iv;
    TextView tv;
}
}

快照

在此处输入图像描述

在此处输入图像描述

编辑:

在评论中回答你的问题

列表bkg.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" 

        android:drawable="@drawable/appicon" />
    <item  android:state_focused="false" 
        android:drawable="@drawable/ic_launcher" />
</selector>

然后对于 xml 中的 ImageView

android:background="@drawable/listbkg" 
于 2013-10-19T06:03:16.263 回答
0

我可以猜到什么可以解决你的问题。但首先,我强烈建议您观看 Android 的 ListView API 首席架构师的精彩视频演示(如果您还没有):

http://www.youtube.com/watch?v=wDBM6wVEO70

于 2013-10-19T05:41:24.357 回答