Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中更改所选列表视图项目图像问题_Android_Listview - Fatal编程技术网

在android中更改所选列表视图项目图像问题

在android中更改所选列表视图项目图像问题,android,listview,Android,Listview,在我的应用程序中,我只是使用列表视图来显示图像和文本。这是我的适配器编码 ArrayAdapter<String> adapter=new ArrayAdapter<String>(MainActivity.this, R.layout.list_item, R.id.name, arrList); listProductCategories.setAdapter(adapter); listProductCategories.setOnItemCli

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

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();

        }
    });
ArrayAdapter=新的ArrayAdapter(MainActivity.this,R.layout.list_项,R.id.name,arrList);
listProductCategories.setAdapter(适配器);
setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
ImageView imgview=(ImageView)view.findViewById(R.id.iv_列表项);
//改变它的背景
imgview.setBackgroundResource(R.drawable.fail);
字符串名称=((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" />

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


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

改变

  • 获取项目的位置
  • 在该位置更改项目
  • 在适配器上调用
    notifyDataSetChanged()
    ,以刷新listview
  • 例如:

    ItemsHolder ih = hold.get(position);
    ih.setImage(decodeImage(R.drawable.appicon));
    ih.setName("Changed");
    cus.notifyDataSetChanged();
    
    test.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>
    

    你可以发布
    R.layout.list\u item
    这是list\u item:请给我一些要求的示例..突出显示所选列表项图像背景在ArrayAdapter中,如果convertView不为null,getView()方法将返回相同的视图实例。因此,当您更改视图的图像时,与该视图相同的实例也会受到影响…@GopalRao你可以发布一些示例编码吗是的..但是我想为我的问题提供一些更快速的解决方案。是的,编码很好..非常感谢..但是我想为另一个问题提供一个解决方案。当用户选择任何列表项时,图像都会被更改。但这里的问题是当用户单击另一个列表项时列表项上一个选定的图像显示已更改的图标。如何避免这些问题?此时,只有一个选定的列表项图像将被更改。@Android\u kalai我不明白您的意思problem@Android_kalai您只需要单击一项即可更改背景,这是您想要的吗?为此使用选择器。不需要所有这些。你的问题令人困惑。我给出的代码旨在更改单击的项目的背景,但它仍然存在。我的问题是,用户选择第一个列表项意味着第一个图像将被更改。之后,用户选择第二个列表项意味着第二个图像将被更改。此时,第一个和第二个图像显示为已更改状态。
    <?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>
    
    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;
    }
    }
    
    <?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>
    
    android:background="@drawable/listbkg"