android - 获取recyclerview位置并在点击时传递对象

标签 android json android-intent position android-recyclerview

伙计们,我真的需要你们的帮助,我被困住了。简而言之,我制作了 recyclerview 来显示我解析的 json 数据。我坚持的是如何获得 recyclerview 位置并将 json 对象传递给新的 Activity 槽 Intent 。这是我的代码,因此您可以看到发生了什么。 主要 Activity :

public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {

ArrayList<Item> end = new ArrayList<Item>();
RecyclerView recyclerView;
Adapter adapter;
List<Item> mModels;
Context context = this;

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelableArrayList("KEY2", end);

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // View view = LayoutInflater.from(this).inflate(R.layout.activity_main, null, false);
    setContentView(R.layout.activity_main);
    recyclerView = (RecyclerView) findViewById(R.id.RecylerView);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter = new Adapter(this);
    recyclerView.setAdapter(adapter);


    if (isAvailable() && savedInstanceState == null)
    //Check if network is available
    {
        jsonreq();
    } else if (savedInstanceState != null)

    {
        end = savedInstanceState.getParcelableArrayList("KEY2");
        adapter.list(end);


    } else {
        Toast.makeText(this, "Molimo, ukljucite internet.", Toast.LENGTH_LONG).show();

    }


}


private boolean isAvailable() {
    ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    Boolean isAvail = false;
    if (networkInfo != null && networkInfo.isConnected()) {
        isAvail = true;
    }
    return isAvail;

}

public void jsonreq() {
    String url = "http://www.json-generator.com/api/json/get/cfOhbHcpki?indent=2";
    RequestQueue requestQueue = VolleySingelton.getrequestQueue();

    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            end = getdata(response);
            adapter.list(end);

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
    requestQueue.add(request);

}

private ArrayList<Item> getdata(JSONObject response) {
    ArrayList<Item> listy = new ArrayList<Item>();

    try {

        JSONArray array = response.getJSONArray("items");

        for (int i = 0; i < array.length(); i++) {
            JSONObject object1 = array.getJSONObject(i);
            String content = object1.getString("caption");
            String url = object1.getString("url");
            String proba = object1.getString("proba");
            // ImageView image = process(url,imageView);
            Item I = new Item(content, url, proba);
            listy.add(I);

        }


    } catch (JSONException e) {
        e.printStackTrace();
        Toast.makeText(this, "Error" + e, Toast.LENGTH_LONG).show();
    }
    Log.d("mohak", "" + response.length());

    return listy;

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    MenuItem menuItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
    SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchView.setIconifiedByDefault(true);
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return true; // handled
        }

        @Override
        public boolean onQueryTextChange(String newText) {

           adapter.getFilter().filter(newText);

            return true;
        }
    });
    return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar Item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}


@Override
public boolean onQueryTextSubmit(String query) {
    return false;
}

@Override
public boolean onQueryTextChange(String newText) {
    return false;
}

这是适配器:

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> implements  Filterable{

public static final String LIST_DETAIL_KEY = "list";

public Item item;

private LayoutInflater inflater;
Context context;
ArrayList<Item> fin = new ArrayList<Item>();


Adapter(Context context) {
    inflater = LayoutInflater.from(context);
    this.context = context;
}

public void list(ArrayList<Item> fin) {
    this.fin = fin;
    Search search = new Search(fin);
    notifyItemRangeChanged(0, fin.size());
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

    View view = inflater.inflate(R.layout.rac, viewGroup, false);
    ViewHolder holder = new ViewHolder(view);

    return holder;
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {

    Item current = fin.get(i);
    viewHolder.content.setText(current.content);
    viewHolder.proba.setText(current.proba);


    //  Uri uri = Uri.parse(current.url);
    //  Context context = viewHolder.imageView.getContext();
    Picasso.with(context).load(current.url).into(viewHolder.imageView);

}

@Override
public int getItemCount() {
    return fin.size();
}

@Override
public Filter getFilter() {
    Search search = new Search(fin);
    return search;
}


class ViewHolder extends RecyclerView.ViewHolder {
    TextView content;
    TextView proba;
    ImageView imageView;


    public ViewHolder(View itemView) {
        super(itemView);

        content = (TextView) itemView.findViewById(R.id.textView);
        proba = (TextView) itemView.findViewById(R.id.textView2);
        imageView = (ImageView) itemView.findViewById(R.id.imageView);


    }
}
}

提前致谢。

最佳答案

我们处理点击事件,我试过下面的方法 创建接口(interface)RecyclerOnItemClickListener

import android.view.View;

/**
 * A click listener for items.
 */
public interface RecyclerOnItemClickListener {
    /**
     * Called when an item is clicked.
     *
     * @param childView View of the item that was clicked.
     * @param position  Position of the item that was clicked.
     */
    public void onItemClick(View childView, int position);
}

在适配器类中,您可以获取在调用 Activity/Fragment 中实现的 RecyclerOnItemClickListener 对象

RecyclerOnItemClickListener mItemClickListener;

然后您可以在适配器的构造函数中初始化该变量

mItemClickListener = recyclerOnItemClickListener;

Activity/fragment 实现了 RecyclerOnItemClickListener 接口(interface),因此它将实现 onItemClick 方法。您可以在这里编写下一个 Activity 中传递数据的代码

@Override
    public void onItemClick(View childView, int position)
    {
        Intent intent = new Intent(getActivity(), NextActivity.class);
        intent.putExtra("ITEM", mModels.get(position));
        startActivity(intent);
    }

在适配器类中,您需要初始化 ViewHolder 类,如下所示:

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
    TextView content;
    TextView proba;
    ImageView imageView;


    public ViewHolder(View itemView) {
        super(itemView);

        content = (TextView) itemView.findViewById(R.id.textView);
        proba = (TextView) itemView.findViewById(R.id.textView2);
        imageView = (ImageView) itemView.findViewById(R.id.imageView);


    }

        @Override
        public void onClick(View v)
        {
            if (mItemClickListener != null)
            {
                mItemClickListener.onItemClick(v, getPosition());
            }
        }
}

希望这对你有帮助..

关于android - 获取recyclerview位置并在点击时传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34674100/

相关文章:

java - 同一个地方的经度和纬度点变化

java - 如何从 AsyncTask 的类中获取 JsonArray

android - 扩展应用程序类和良好实践

c# - 如何遍历 json 对象中的项目并在 C# 中检索特定值?

android - 设置安卓系统音量

android - 无法在服务 onStart() 中检索 Intent Extras

android - 从第二个 Activity 访问在主 Activity 中创建的 Android SQLite 数据库

android - 在某些 Android 设备上握手失败

python - 无法从 JSON 反序列化 PyMongo ObjectId

javascript - 使用 json 对象附加选择选项值和文本