我正在尝试自定义ListView
以获得默认背景图片并突出显示每一行的背景图片。
但是,突出显示的背景图像会影响单行,默认背景图像会影响整个ListView
;但我需要它来影响每一行。
有人能告诉我怎么做吗?
这是我的代码:
布局/ main.xml中:
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:dividerHeight="1dip"
android:listSelector="@drawable/bg_highlighted"
/>
抽拉/ selector.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/bg_default"/>
<item android:state_focused="true" android:drawable="@drawable/bg_default"/>
</selector>
的src / main.java:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this,R.layout.list, mStrings); /*"Item1","Item2","Item3","Item4"*/
ListView lv = (ListView)findViewById(R.id.list);
lv.setAdapter(adapter);
lv.setBackgroundResource(R.drawable.selector);
作为默认背景和突出显示的背景,我使用png图像。
答案 0 :(得分:1)
我确实喜欢上面提到的 heepie 。
据我所知,没有一个属性可以直接将背景绘制为ListView
的单行。应该通过在自定义适配器的getView
方法中创建自定义视图来完成。这是我的最终代码。可能对某人有用。
的布局/ main.xml中:强>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/my_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
<强>布局/ my_list_item.xml:强>
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/my_textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="left|center_vertical"
android:paddingLeft="6dip"
android:textColor="#FFFFFF"
android:background="@drawable/list_selector"
/>
<强>抽拉/ list_selector.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/bg_highlighted" />
<item android:drawable="@drawable/bg_default" />
</selector>
可绘制的png图片:
的抽拉/ bg_default.png:强>
<强>抽拉/ bg_highlighted.png:强>
<强>的src / main.java:强>
public class main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MyAdapter adapter;
ArrayList<String> mStrings = new ArrayList<String>();
mStrings.add("Item 1");
mStrings.add("Item 2");
mStrings.add("Item 3");
mStrings.add("Item 4");
ListView lv = (ListView) findViewById(R.id.my_list);
adapter = new MyAdapter(this, mStrings);
lv.setAdapter(adapter);
}
}
<强>的src / MyAdapter.java:强>
public class MyAdapter extends BaseAdapter {
public Activity activity;
ArrayList<String> data = new ArrayList<String>();
private static LayoutInflater inflater = null;
public MyAdapter(Activity a, ArrayList<String> d) {
activity = a;
data = d;
inflater = LayoutInflater.from(activity);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.my_list_item, null);
holder = new ViewHolder();
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Touch on view handle
Log.d("", "Touched row "+position);
}
});
//customizing view
holder.textView = (TextView)convertView.findViewById(R.id.my_textview);
holder.textView.setText(data.get(position));
return convertView;
}
public static class ViewHolder {
public TextView textView;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
}
这是一个结果:
答案 1 :(得分:0)
我看到的问题是你实际上在这里使用项目选择器作为整个ListView背景:
lv.setBackgroundResource(R.drawable.selector);
您所要做的就是将此选择器设置为layout/list.xml
内根视图的背景(列表中每个项目的布局已膨胀)
答案 2 :(得分:0)
使用新的类扩展baseadapter并从getview方法更改每行的背景,而不是使用arrayadapter可能会更好