【问题标题】:Android: How to get all data which a list item hold?Android:如何获取列表项包含的所有数据?
【发布时间】:2016-01-03 23:13:05
【问题描述】:

我有一个非常复杂的列表项,如图所示。

它有一个标题,图片,评分(评分栏),评分计数(文本视图),最喜欢的指示器(图像),最喜欢的计数(文本视图),喜欢指示器,喜欢计数(文本视图),尝试指示器(图像) 并尝试计数(文本视图)。

它通过这个自定义光标适配器从 sqlite db 获取所有这些数据:

 public class RecListCursorAdapter extends CursorAdapter {

public RecListCursorAdapter(Context context, Cursor c, int flags) {
    super(context, c, flags);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return LayoutInflater.from(context)
            .inflate(R.layout.list_item, parent, false);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    ImageView thumbImg = (ImageView) view.findViewById(R.id.avatar);
    ImageView favImg = (ImageView) view.findViewById(R.id.imageFav);
    ImageView likeImg = (ImageView) view.findViewById(R.id.imageLike);
    ImageView triedImg = (ImageView) view.findViewById(R.id.imageTried);

    thumbImg.setImageResource(cursor.getInt(cursor.getColumnIndex(DBHelper.REC_THUMB_ID)));

    if (cursor.getInt(cursor.getColumnIndex(DBHelper.REC_FAV)) == 1) {
        favImg.setImageResource(R.drawable.heart_on);
    }

    if (cursor.getInt(cursor.getColumnIndex(DBHelper.REC_LIKED)) == 1) {
        likeImg.setImageResource(R.drawable.thumb_on);
    }

    if (cursor.getInt(cursor.getColumnIndex(DBHelper.REC_TRIED)) == 1) {
        triedImg.setImageResource(R.drawable.tried_on);
    }

    TextView title = (TextView) view.findViewById(R.id.text_title);
    TextView favCnt = (TextView) view.findViewById(R.id.txtFavCnt);
    TextView likeCnt = (TextView) view.findViewById(R.id.txtLikeCnt);
    TextView triedCnt = (TextView) view.findViewById(R.id.txtTriedCnt);

    title.setText(cursor.getString(cursor.getColumnIndex(DBHelper.REC_NAME)));
    favCnt.setText(cursor.getString(cursor.getColumnIndex(DBHelper.REC_FAV_CNT)));
    likeCnt.setText(cursor.getString(cursor.getColumnIndex(DBHelper.REC_LIKE_CNT)));
    triedCnt.setText(cursor.getString(cursor.getColumnIndex(DBHelper.REC_TRIED_CNT)));

    RatingBar rating = (RatingBar) view.findViewById(R.id.list_ratingbar);
    rating.setRating(cursor.getFloat(cursor.getColumnIndex(DBHelper.REC_RATING)));
}
}

现在我正在将行 ID 发送到一个详细活动,该活动查询数据库以再次获取相同的数据,这意味着我两次查询数据库以获得相同的数据

  listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            Intent intent = new Intent(getActivity(), RecipeDetailActivity.class);
            intent.putExtra(RecipeDetailActivity.EXTRA_POSITION, String.valueOf(id));
            getActivity().startActivity(intent);
        }
    });

我想要做的是将数据从列表项发送到详细信息活动以显示以保存第二个查询

我认为我可以参考这些视图并从中获取值,但由于图像视图、文本视图和评分栏,这将是一个非常复杂的过程。

当然有一种更简单、更智能的方法可以做到这一点,但我想不通。

我做了很多搜索但没有运气。

你能指导我在这里做什么吗?

【问题讨论】:

  • 聪明的方法是将 Sqllite 代码拆分为一个类来执行不同的功能,这样您就可以从任何活动中访问它们而无需重复代码 --hmkcode.com/android-simple-sqlite-database-tutorial
  • 从光标创建一个 ArrayList,其中 Model 实例将数据存储在 SQLite 的单行中并在适配器中使用该 ArrayList?
  • @Tasos 我已经这样做了,这不是我不想重复的代码,它再次查询数据库以获得相同的数据。
  • 你可以把这个Model做成parcelable,直接发送到下一个activity,这显然比对你要发送的每一个数据都调用putExtra要好
  • @Sourabh 我没看清楚,你能不能给个代码 sn-p 来澄清一下?

标签: android sqlite


【解决方案1】:

选项 1

未测试!

在你的适配器中添加一个方法,像这样

public void getData(int position) {
    Cursor cursor = getCursor();
    int p = cursor.getPosition;
    cursor.moveToPosition(position);
    // ... get data here
    cursor.moveToPosition(p);
}

将返回类型更改为您喜欢的任何类型

选项 2

从光标创建一个 ArrayList,其中 Model 可能类似于

class Model {
    public String title;
    public String image;
    public boolean rated;
    public int ratingCount;
    public boolean favorited;
    public int favoriteCount;
    public boolean liked;
    public int likeCount;
    public boolean tried;
    public int triedCount;
}

并将 [ArrayAdapter (Context context, int resource, int textViewResourceId, List objects)](http://developer.android.com/reference/android/widget/ArrayAdapter.html#ArrayAdapter(android.content.Context, int, int, java.util.List)) 与您的 ListView 一起使用

【讨论】:

  • 谢谢您,我会尝试并回复您。
  • @Mohammad -- 我不会选择数组选项。重点是什么。假设您可以在详细信息页面中更新评级等,您将不得不将更改保存在数组和数据库中,那么这如何更智能。你最终会得到更多的代码
  • @Tasos 不是我要收缩的代码,我想减少我朋友的db查询次数,因为这需要很多时间。而且你的观点也很好。
  • @Mohammad -- 啊,现在说得通了。好吧,您想加快速度,然后使用图像的 URL 并从网络获取它们,而不是将它们存储在数据库中。它们无论如何都会被缓存,因此对 URL 的请求只会执行一次,其余时间它将来自缓存,因此没有网络请求。使用像毕加索这样的东西——square.github.io/picasso
  • @Mohammad -- 外包速度快 100 倍,尤其是当您有超过一百万条记录要处理时 -- 试试这个androidhive.info/2014/07/…
猜你喜欢
  • 2014-06-26
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多