伙计们,我真的需要你们的帮助,我被困住了。简而言之,我制作了 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/