我有问题从selector.xml项目样式(背景)
样式化我的列表视图颜色未切换显示所有项目黑色,我想切换黑色和白色之间的项目颜色,现在瞄准切换项目颜色从listview适配器,但当我从listview适配器切换项目颜色时,我点击任何项目项目背景变成蓝色!
这是我的代码
public class Home_ForumsList_listview extends ArrayAdapter<Object>{
private int[] colors = new int[] { 0x30ffffff, 0x30808080 };
Context context;
private LayoutInflater mInflater;
@SuppressWarnings("rawtypes")
ArrayList ob;
int resource ;
/*================================================
* Setup ListView
*===============================================*/
@SuppressWarnings("unchecked")
public Home_ForumsList_listview (Context context, int resource, @SuppressWarnings("rawtypes") ArrayList objects) {
super(context, resource,objects);
this.context = context;
this.ob = objects;
this.resource = resource;
mInflater = LayoutInflater.from(context);
}
/*================================================
* Items Counter
*===============================================*/
public int getCount() {
return ob.size();
}
/*================================================
* Item Posistion JSON
*===============================================*/
public JSONObject getItem(JSONObject position) {
return position;
}
/*================================================
* Item Position
*===============================================*/
public long getItemId(int position) {
return position;
}
/*================================================
* Hold Views inside Chant Bit View
*===============================================*/
static class ViewHolder {
TextView forum_title;
TextView forum_desc;
TextView forum_catagories;
TextView forumcode;
Button popup_but_id;
RatingBar ratingsmall;
}
/*================================================
* Setup Each View raw by raw
*===============================================*/
public View getView(final int position, View convertView, ViewGroup parent)
{
final ViewHolder holder;
JSONObject r = (JSONObject) getItem(position);
if(convertView == null)
{
convertView = mInflater.inflate(R.layout.a_home_forumslist_bit, null);
holder = new ViewHolder();
convertView.setTag(holder);
holder.forum_title = (TextView) convertView.findViewById(R.id.flist_forum_title);
holder.forum_desc = (TextView) convertView.findViewById(R.id.flist_forum_desc);
holder.forum_catagories = (TextView) convertView.findViewById(R.id.flist_forum_catagories);
holder.forumcode = (TextView) convertView.findViewById(R.id.flist_forumcode);
holder.ratingsmall = (RatingBar) convertView.findViewById(R.id.ratingsmall);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
int colorPos = position % colors.length;
convertView.setBackgroundColor(colors[colorPos]);
try {
holder.forum_title.setText(r.getString("forum_title"));
if ( r.getString("forum_desc").equals(""))
{
holder.forum_desc.setVisibility(View.GONE);
}
float z = (float) r.getInt("rate");
holder.ratingsmall.setRating(z);
holder.forum_desc.setText(r.getString("forum_desc"));
holder.forumcode.setText( context.getString(R.string.forumcode) + " : ( "+ r.getLong("forumcode") + " ) ");
holder.forum_catagories.setText( " : " + r.getString("forum_catagories"));
} catch (JSONException e) {
e.printStackTrace();
}
return convertView;
}
}
我用Google搜索了如何设置listview的样式,所有显示相同颜色的示例都从Adapter切换,有没有办法从selector.xml设置listview项的样式?
抱歉我的英语不好^ _ ^我希望你能得到它答案 0 :(得分:1)
听起来你想要在列表中替换背景颜色,因此项目0为白色,项目1为黑色,项目2为白色等。
首先,将您的颜色定义为Android资源:
res / colors.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white">#ffffff</color>
<color name="black">#000000</color>
</resources>
然后,使用这些资源标识符作为背景。现在,你给它的颜色十六进制为int,这是错误的 - 它期望一个int是一个资源标识符。像这样:
private int[] colors = new int[] { R.color.white, R.color.black };
那应该有用。尝试一下。
要摆脱蓝色高光,你可以制作选择器并使用它们而不仅仅是黑色和白色:
抽拉/ dark_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:color="@color/gray"
android:pressed="true" />
<item android:color="@color/black" />
</selector>
然后使用drawables作为背景。
private int[] colors = new int[] {
R.drawable.lightSelector,
R.drawable.darkSelector
};
答案 1 :(得分:1)
我有两个想法:
也许您忘记设置透明ListView的cache color hint,您可以看到this answer。
android:cacheColorHint="@android:color/transparent"
或者您可能需要将ListView上的scrolling cache设置为false。
android:scrollingCache="false"
PD:发布XML布局可能很有用。
答案 2 :(得分:1)
如果您只想在listView中替换行的颜色,可以使用普通的listView和您选择的BaseAdapter。
看看它:
package com.example.joignabilite;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ContactAdapter extends BaseAdapter {
// Une liste de Contacts
private List<Contact> mListP;
// Le contexte dans lequel est présent notre adapter
private Context mContext;
// Un mécanisme pour gérer l'affichage graphique depuis un layout XML
private LayoutInflater mInflater;
private int white = 0xFFFFFFFF;
private int grey = 0x33000000;
public ContactAdapter(Context context, List<Contact> aListP) {
mContext = context;
mListP = aListP;
mInflater = LayoutInflater.from(mContext);
}
public int getCount() {
return mListP.size();
}
public Object getItem(int position) {
return mListP.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout layoutItem;
// (1) : Réutilisation des layouts
if (convertView == null) {
// Initialisation de notre item à partir du layout XML
// "Contact_layout.xml"
layoutItem = (LinearLayout) mInflater.inflate(
R.layout.item_contact, parent, false);
} else {
layoutItem = (LinearLayout) convertView;
}
// (2) : Récupération des TextView de notre layout
TextView tv_Nom = (TextView) layoutItem
.findViewById(R.id.repertoire_item);
// (3) : Renseignement des valeurs
tv_Nom.setText(mListP.get(position).nom);
// On mémorise la position de la "Contact" dans le composant textview
tv_Nom.setTag(position);
/*
* Here is the way to change color using pair and unpair line
*/
if (position % 2 == 0)
layoutItem.setBackgroundColor(grey);
else
layoutItem.setBackgroundColor(white);
// On ajoute un listener
tv_Nom.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Lorsque l'on clique sur le nom, on récupère la position du
// "Contact"
Integer position = (Integer) v.getTag();
// On prévient les listeners qu'il y a eu un clic sur le
// TextView "TV_Nom".
sendListener(mListP.get(position), position);
}
});
// On retourne l'item créé.
return layoutItem;
}
/**
* Interface pour écouter les évènements sur le nom d'une Contact
*/
public interface ContactAdapterListener {
public void onClickNom(Contact item, int position);
}
// Contient la liste des listeners
private ArrayList<ContactAdapterListener> mListListener = new ArrayList<ContactAdapterListener>();
/**
* Pour ajouter un listener sur notre adapter
*/
public void addListener(ContactAdapterListener aListener) {
mListListener.add(aListener);
}
private void sendListener(Contact item, int position) {
for (int i = mListListener.size() - 1; i >= 0; i--) {
mListListener.get(i).onClickNom(item, position);
}
}
}