我使用的是有关联的评论的 项目下面的列表布局。 评论数由右侧方框中显示。
目前,我使用的onListItemClick
处理程序启动另一个细节来看。
public class CustomListFragment extends ListFragment
implements LoaderCallbacks<Cursor> {
private Activity mActivity;
private CursorAdapter mAdapter;
private QueryParameters mQueryParameters;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setEmptyText("No data to display");
mActivity = getActivity();
if (mActivity == null) {
Log.e(getClass().getName(), "Activity is null");
return;
}
// Prepare query.
mQueryParameters = QueryHelper.getQueryParameters(mActivity);
if (mQueryParameters == null || !mQueryParameters.isPreparedForLoader()) {
Log.d(getClass().getName(), "One or more query parameters are null.");
return;
}
mAdapter = new CustomCursorAdapter(mActivity, null, 0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle extras) {
return new CursorLoader(mActivity,
mQueryParameters.uri,
mQueryParameters.fromColumnsLoader,
mQueryParameters.selection,
mQueryParameters.selectionArgs,
mQueryParameters.sortOrder);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
mAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Intent intent = new Intent(mActivity, ItemDetailsActivity.class);
intent.putExtra("ITEM_URI", mItemUri);
mActivity.startActivity(intent);
}
}
我想实现的是,用户可以触摸框元素的权利。 那么这个动作应该启动相关CommentsActivity
。 当用户触摸左侧,但是,它仍然应该启动ItemDetailsActivity
。
在这两种情况下,我需要通过itemUri
的意图,以使这些细节视图或者可以加载特定项目的评论列表。
所述ListFragment
使用CursorAdapter
绑定TextView
s到一个项目的属性。
题:
您还没有发布相关的适配器本身的任何代码,但是我发现你刚才的问题 ,你是最那里的方式。
快速和肮脏的答案
在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来获得它。
高级回答
在你前面的问题,我注意到你在做一些重复的调用和蒂亚戈·莫雷拉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
认为你正在使用的列的索引。 你只需要获得列索引一次 ,除非你改变光标也不会改变 -
commentsClick
是一个通用的OnClickListener,我使用的每一行,我把它在创建ViewHolder
- 我把你的方法改变HSV颜色插入适配器,并把它称为
applyColorFilter()
- 我感动创建
ViewHolder
到newView()
而不是检查一个null
一个在bindView()
该行布局
你可能注意到了,我改意见颜色有点不同,那是因为我用一个简单的排布局:
<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>
(虽然蒂亚戈·莫雷拉Rocha的布局工作,嵌套ViewGroups似乎有点小题大做。任何时候你都只有一个孩子的ViewGroup,通常他们是一个另类。)
我用一个LayerDrawable来代替两个LinearLayouts,我将逐步解释英寸 首先,边界( 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。 如果这是真的,不断变化的阿尔法值是一项简单的任务。 查找我的意见bindView()
- 注释
applyColorFilter(holder.comments_color, count);
- 取消注释
holder.comments_color.setAlpha(count * 45);
- 打开我的
color.xml
文件,并改变color
的属性solid
从元素#ffffff
至#2aff00
在所有实话我以前从来没有使用LayerDrawables这样,有可能是一个更快的方式,但我认为这是非常漂亮的。