更改Android的选择列表视图项图像问题 [英] Change selected list view item image issue in android
问题描述
在我的应用程序只使用了显示图像和文字列表视图。这是我的适配器编码
ArrayAdapter<串GT;适配器=新ArrayAdapter<串GT;(MainActivity.this,R.layout.list_item,R.id.name,arrList); listProductCategories.setAdapter(适配器); listProductCategories.setOnItemClickListener(新OnItemClickListener(){ @覆盖
公共无效onItemClick(适配器视图<>母公司,观景,
INT位置,长的id){ ImageView的imgview =(ImageView的)view.findViewById(R.id.iv_listitem);
//这里改变它的背景
imgview.setBackgroundResource(R.drawable.fail); 字符串名称=((的TextView)view.findViewById(R.id.name))
.getText()的toString()。
Toast.makeText(MainActivity.this,+名称,10).show(); }
});
这是截屏上面的编码。
我在这里强调选中的列表items.But我的输出显示一些许多列表视图项图像背景的改变。
请给我一个解决方案......
< ImageView的机器人:ID =@ + ID / iv_listitem
机器人:layout_width =20dp
机器人:layout_height =20dp
机器人:layout_gravity =center_vertical
机器人:背景=@绘制/ next_unselect
机器人:可聚焦=FALSE/>
<的TextView
机器人:ID =@ + ID /名称
机器人:layout_width =match_parent
机器人:layout_height =WRAP_CONTENT
机器人:layout_gravity =center_vertical
机器人:可聚焦=假
机器人:文字=TextView的
机器人:文字颜色=#003366/>
列表项 -
< ImageView的机器人:ID =@ + ID / iv_listitem的android:layout_width =20dp机器人:layout_height =20dp机器人:layout_gravity =center_vertical机器人:背景=@绘制/ next_unselect机器人:可聚焦=FALSE/> < TextView的机器人:ID =@ + ID /名称的android:layout_width =match_parent机器人:layout_height =WRAP_CONTENT机器人:layout_gravity =center_vertical机器人:可聚焦=false的机器人:文本=TextView的机器人:文字颜色=#003366/>
我已经使用了自定义的ListView使用自定义适配器和getter和setter方法ItemsHolder类。
要更改
- 获得该项目的位置。
- 在位置更改的项目。
- 呼叫
notifyDataSetChanged()
您的适配器上刷新列表视图。
例如:
ItemsHolder IH = hold.get(位置);
ih.setImage(德$ C $的CImage(R.drawable.appicon));
ih.setName(更改);
cus.notifyDataSetChanged();
的test.xml
<的RelativeLayout的xmlns:机器人=http://schemas.android.com/apk/res/android
的xmlns:工具=http://schemas.android.com/tools
机器人:layout_width =match_parent
机器人:layout_height =match_parent工具:上下文=MenuActivity。>< ListView控件
机器人:ID =@ + ID / listView_Menu
机器人:layout_width =match_parent
机器人:layout_height =WRAP_CONTENT
>< /&的ListView GT;
< / RelativeLayout的>
list_item.xml
<?XML版本=1.0编码=UTF-8&GT?;
<的RelativeLayout的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =match_parent
机器人:layout_height =match_parent>< ImageView的
机器人:ID =@ + ID / imageView_List_Item
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:layout_centerHorizontal =真
机器人:contentDescription =@字符串/ APP_NAME
机器人:SRC =@绘制/ ic_launcher/><的TextView
机器人:ID =@ + ID / textView1
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:layout_below =@ + ID / imageView_List_Item
机器人:layout_centerHorizontal =真
机器人:layout_marginTop =28dp
机器人:文字=TextView的/>< / RelativeLayout的>
MainActivity.java
公共类MainActivity延伸活动{
ArrayList的< ItemsHolder>举办=新的ArrayList< ItemsHolder>();
CustomAdapter CUS;
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.test);
位图[] =图像德{$ C $的CImage(R.drawable.ic_launcher),德$ C $的CImage(R.drawable.ic_launcher)};
ListView控件列表=(ListView控件)findViewById(R.id.listView_Menu);
hold.add(新ItemsHolder(图像[0],image1的));
hold.add(新ItemsHolder(图像[1],图像2));
CUS =新CustomAdapter(保持);
list.setAdapter(CUS);
list.setOnItemClickListener(新OnItemClickListener()
{
公共无效onItemClick(适配器视图<>母公司,查看
看来,INT位置,长的ID)
{
ItemsHolder IH = hold.get(位置);
ih.setImage(德$ C $的CImage(R.drawable.appicon));
ih.setName(更改);
cus.notifyDataSetChanged(); }
});}
私人位图德$ C $的CImage(INT RES){
位图位图= BitmapFactory.de codeResource(getResources()RES);
返回位图;
}
类ItemsHolder
{
位图图像;
字符串名称;
公共ItemsHolder(位图位图,串串){
// TODO自动生成构造函数存根
图像=位图;
名称=字符串;
}
公共位图的getImage(){
返回形象;
}
公共无效setImage(位图图像){
this.image =图像;
}
公共字符串的getName(){
返回名称;
}
公共无效setname可以(字符串名称){
this.name =名称;
}}
类CustomAdapter扩展了BaseAdapter
{ LayoutInflater吹气;
ArrayList的< ItemsHolder>清单;
公共CustomAdapter(ArrayList的< ItemsHolder>清单)
{
this.list =清单;
吹气= LayoutInflater.from(MainActivity.this); }
@覆盖
公众诠释的getCount(){
// TODO自动生成方法存根
返回则为list.size();
}
@覆盖
公共对象的getItem(INT为arg0){
// TODO自动生成方法存根
返回将arg0;
}
@覆盖
众长getItemId(INT位置){
// TODO自动生成方法存根
返回0;
}
@覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup){
// TODO自动生成方法存根
ViewHolder持有人;
如果(convertView == NULL)
{
持有人=新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(保持器);
}
其他{
支架=(ViewHolder)convertView.getTag();
}
ItemsHolder IH = list.get(位置);
holder.iv.setImageBitmap(ih.getImage());
holder.tv.setText(ih.getName());
返回convertView;
}}
类ViewHolder
{
ImageView的IV;
TextView的电视;
}
}
捕捉
编辑:
要在评论你的问题。
listbkg.xml
<?XML版本=1.0编码=UTF-8&GT?;
<选择的xmlns:机器人=http://schemas.android.com/apk/res/android>
<项目的android:STATE_ pressed =真 机器人:可绘制=@绘制/ APPICON/>
<项目的android:state_focused =假
机器人:可绘制=@绘制/ ic_launcher/>
< /选择>
然后在XML的ImageView
的android:背景=@绘制/ listbkg
In my application i just using list view for displaying image and text. This is my adapter coding
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();
}
});
This is the screen shot for above coding.
Here i am highlighting the selected list items.But my output displays some of the many list view item image background changed..
Please give me a solution....
<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" />
list item-
<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" />
I have used a Custom ListView with a Custom Adapter and a ItemsHolder class with getter and setters.
To change
- Get the position of the item.
- Change the item at the position.
- Call
notifyDataSetChanged()
on your adapter to refresh listview.
Example:
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>
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;
}
}
Snaps
Edit:
To your question in the comment
listbkg.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>
Then for ImageView in xml
android:background="@drawable/listbkg"
这篇关于更改Android的选择列表视图项图像问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!