您没有发布任何与适配器本身相关的代码,但我找到了您之前的问题,并且您大部分时间都在那里。
快速而肮脏的答案
在bindView()
中,让我们修改您的comments_count
TextView 以将当前行的索引保存在标记中(为您的itemUri
)并添加一个简单的 OnClickListener:
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder)view.getTag();
if (holder == null) {
...
holder.comments_count.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Get the position from the ViewHolder
long id = (Long) v.getTag();
Toast.makeText(v.getContext(), "Comment Click: " + id, Toast.LENGTH_SHORT).show();
}
});
}
...
holder.comments_count.setTag(cursor.getLong(0));
}
当用户点击该行时,它仍然会调用onListItemClick()
,除非他们点击评论框。评论框会触发上面的 OnClickListener,您可以在其中将用户定向到您的CommentsActivity
. 你没有提到你在哪里获取不同的值,itemUri
但我认为你需要行的 id 来获取它。
优秀的答案
在您之前的问题中,我注意到您正在进行一些重复调用,并且 Thiago Moreira Rocha 的布局非常复杂,可以重复使用(对于每个 ListView 行)。所以我提出了一种不同的方法。我将我的答案分为与适配器、行布局和颜色相关的部分comments_count
:
适配器
我会把代码完整贴出来,然后在底部解释:
public class CustomCursorAdapter extends CursorAdapter {
private LayoutInflater mInflater;
private int[] mFrom;
private OnClickListener commentClick = new OnClickListener() {
@Override
public void onClick(View v) {
// Get the position saved in bindView()
long id = (Long) v.getTag();
Toast.makeText(v.getContext(), "Comment Click: " + id, Toast.LENGTH_SHORT).show();
}
};
public CustomCursorAdapter(Context context, Cursor cursor, int flags) {
super(context, cursor, flags);
mInflater = LayoutInflater.from(context);
}
private void applyColorFilter(Drawable drawable, int count) {
drawable.clearColorFilter();
if (count > 0) {
float saturation = (count * 15) / 100f;
// The value gets pinned if out of range.
int color = Color.HSVToColor(new float[] {110f, saturation, 1f});
drawable.setColorFilter(color, Mode.SRC);
}
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
holder.title.setText(cursor.getString(mFrom[0]));
holder.description.setText(cursor.getString(mFrom[1]));
// Get comments_count and set it as text
int count = cursor.getInt(mFrom[2]);
holder.comments_count.setText(count + "");
holder.comments_count.setTag(cursor.getLong(0));
// Adjust the color by saturation
applyColorFilter(holder.comments_color, count);
// Alternate method, that I explain in the answer
// Note: set the solid color in color.xml to #2aff00
//holder.comments_color.setAlpha(count * 45);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = mInflater.inflate(R.layout.list_item, parent, false);
ViewHolder holder = new ViewHolder();
holder.title = (TextView)view.findViewById(R.id.title);
holder.description = (TextView)view.findViewById(R.id.description);
holder.comments_count = (TextView)view.findViewById(R.id.comments_count);
holder.comments_count.setOnClickListener(commentClick);
holder.comments_color = ((LayerDrawable) holder.comments_count.getBackground()).findDrawableByLayerId(R.id.color);
view.setTag(holder);
return view;
}
@Override
public Cursor swapCursor(Cursor newCursor) {
if(mFrom == null && newCursor != null) {
mFrom = new int[] {newCursor.getColumnIndex(TITLE), newCursor.getColumnIndex(DESCRIPTION), newCursor.getColumnIndex(COMMENTS_COUNT)};
}
return super.swapCursor(newCursor);
}
private class ViewHolder {
TextView title;
TextView description;
TextView comments_count;
Drawable comments_color;
}
}
我做了一些改变:
mFrom
保存您正在使用的列的索引。您只需要获取一次列索引,除非您更改 Cursor,否则它不会更改
commentsClick
是我用于每一行的一个通用 OnClickListener,我在创建一个ViewHolder
- 我将您更改 HSV 颜色的方法带入适配器并调用它
applyColorFilter()
- 我移动了创建in
ViewHolder
而newView()
不是检查null
一个 inbindView()
行布局
你可能注意到我改变了评论的颜色有点不同,那是因为我使用了更简单的行布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/comments_count"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/title"
android:layout_toLeftOf="@+id/comments_count"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/comments_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="15dp"
android:background="@drawable/comments_layers"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
(虽然Thiago Moreira Rocha 的布局有效,但嵌套的 ViewGroup 似乎有点矫枉过正。只要您有一个只有一个孩子的 ViewGroup,它们通常是一种替代方案。)
我使用 LayerDrawable 来替换两个 LinearLayout,我将分步解释。 首先是边框(border.xml
),和上一个很相似:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="10dp" />
<padding android:bottom="2dp" android:left="2dp" android:right="2dp" android:top="2dp" />
<solid android:color="#ffffff" />
<stroke android:width="2dp"
android:color="#000000" />
</shape>
(注意填充是笔划的宽度。)
二、可调背景色(color.xml
):
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<corners android:radius="10dp" />
<padding android:bottom="10dp" android:left="10dp" android:right="10dp" android:top="10dp" />
<solid android:color="#ffffff" />
</shape>
最后,我创建了一个 LayerDrawable 来组合两个图像 ( comments_layers.xml
):
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/border"
android:drawable="@drawable/border" />
<item
android:id="@+id/color"
android:drawable="@drawable/color" />
</layer-list>
(可选)
您在 中调整 HSV 值的饱和度applyColorFilter()
,但这似乎相当于调整绿色背景的 alpha。如果这是真的,那么更改 alpha 值是一项简单得多的任务。在以下位置找到我的评论bindView()
:
- 注释掉
applyColorFilter(holder.comments_color, count);
- 取消注释
holder.comments_color.setAlpha(count * 45);
- 打开我的
color.xml
文件并将元素的color
属性从更改为solid
#ffffff
#2aff00
事实上,我以前从未使用过像这样的 LayerDrawables,可能有更快的方法,但我认为这很巧妙。