2016-03-04 66 views
-1

我想用RecyclerView替换ListView。我已经建立了它的点击监听这个样子(这是从活动):RecyclerView项目Click Click Listener

//Road Trip selection 
    roadTripList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      RoadTrip trip = trips.get(i); 
      Intent intent= new Intent(RoadTripListActivity.this, RoadTripActivity.class); 
      intent.putExtra("startLocation", trip.getStart()); 
      intent.putExtra("endLocation", trip.getEnd()); 
      intent.putExtra("routeType", trip.getType()); 

      setResult(RoadTripActivity.ROADTRIP_LIST_INTENT_RESULT, intent); 
      finish(); 

      overridePendingTransition(R.anim.in_right, R.anim.out_left); 
     } 
    }); 

    //Road Trip deletion 
    roadTripList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> adapterView, View view, final int i, long l) { 
      new AlertDialog.Builder(RoadTripListActivity.this) 
        .setTitle("Delete this Road Trip?") 
        .setMessage("Are you sure you want to delete this road trip from your saved trips?") 
        .setCancelable(true) 
        .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 

          trips.remove(i); 
          tripStrings.remove(i); 
          tinyDB.putListString("roadtrips", tripStrings); 

          //roadTripList.setAdapter(adapter); 
          adapter.updateAdapter(trips); 
         } 
        }).setNegativeButton("Cancel", null) 
        .create().show(); 
      return true; 
     } 
    }); 

适配器看起来是这样的:

public class RoadTripListAdapter extends  RecyclerView.Adapter<RoadTripListAdapter.ViewHolder> { 

protected ArrayList<RoadTrip> trips; 
protected Context context; 

public RoadTripListAdapter(Context context, ArrayList<RoadTrip> trips) { 
    this.context = context; 
    this.trips = trips; 
} 

public static class ViewHolder extends RecyclerView.ViewHolder { 
    private final TextView startTextView; 
    private final TextView endTextView; 
    private final ImageView imageView; 
    private final LinearLayout itemLayout; 

    public ViewHolder(View v) { 
     super(v); 
     startTextView = (TextView) v.findViewById(R.id.roadtrip_list_start); 
     endTextView = (TextView) v.findViewById(R.id.roadtrip_list_end); 
     imageView = (ImageView) v.findViewById(R.id.roadtrip_list_icon); 
     itemLayout = (LinearLayout) v.findViewById(R.id.roadtrip_list_item_layout); 
    } 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    //Get the corresponding step 
    final RoadTrip trip = trips.get(position); 

    holder.startTextView.setText(trip.getStart()); 
    holder.endTextView.setText(trip.getEnd()); 

    if (trip.getType().equals(SearchType.walking.name())) { 
     holder.imageView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_directions_walk_24dp)); 
    } else { 
     holder.imageView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_directions_car_24dp)); 
    } 
} 

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

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.road_trip_list_item, parent, false); 
    return new ViewHolder(v); 
} 

public void updateAdapter(ArrayList<RoadTrip> trips) { 
    this.trips = trips; 
    this.notifyDataSetChanged(); 
} 
} 

而列表项的xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/roadtrip_list_item_layout" 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"> 

<ImageView 
    android:id="@+id/roadtrip_list_icon" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center_vertical" 
    android:layout_margin="5dp" 
    android:src="@drawable/ic_directions_car_24dp"/> 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:orientation="vertical" 
    android:layout_height="wrap_content"> 

    <TextView 
     android:id="@+id/roadtrip_list_start" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="20sp" 
     android:textColor="@color/black" 
     android:text="Start: "/> 

    <TextView 
     android:id="@+id/roadtrip_list_end" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="20sp" 
     android:textColor="@color/black" 
     android:text="End: "/> 
</LinearLayout> 

</LinearLayout> 

如何设置RecyclerView的等价物?我可以找到关于这个主题的所有内容,都将其设置在适配器内部,但在这种情况下不起作用...有没有办法在Activity中进行设置?

+0

您可以将侦听器传递出自定义适配器。然而,将监听器放入适配器并不是一个好的解决方案。在视图中更好。这样你可以避免泄漏。这是我的意见。 – deadfish

+0

你能解释一下你的意思吗?这并不能真正帮助我... 此外,为什么这是downvoted ?? –

+0

请发布您的RecyclerView适配器代码和列表项xml。 –

回答

0

我想通了:

((Activity) context).setResult(RoadTripActivity.ROADTRIP_LIST_INTENT_RESULT, intent); 
      ((Activity) context).finish(); 

      ((Activity) context).overridePendingTransition(R.anim.in_right, R.anim.out_left); 

我一直在使用getApplicationContext传递的适配器的情况下,所以我改变它到

adapter = new RoadTripListAdapter(this, trips); 

in t他的活动。

0

onBindViewHolder,添加OnClickListenerOnLongClickListener这样的:

itemLayout.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

      RoadTrip trip = trips.get(position); 
      Intent intent= new Intent(RoadTripListActivity.this, RoadTripActivity.class); 
      intent.putExtra("startLocation", trip.getStart()); 
      intent.putExtra("endLocation", trip.getEnd()); 
      intent.putExtra("routeType", trip.getType()); 

      setResult(RoadTripActivity.ROADTRIP_LIST_INTENT_RESULT, intent); 
      finish(); 

      overridePendingTransition(R.anim.in_right, R.anim.out_left); 
     } 
    }); 

    //Road Trip deletion 
    itemLayout.setOnLongClickListener(new View.OnLongClickListener() { 
       @Override 
       public boolean onLongClick(View v) { 
      new AlertDialog.Builder(RoadTripListActivity.this) 
        .setTitle("Delete this Road Trip?") 
        .setMessage("Are you sure you want to delete this road trip from your saved trips?") 
        .setCancelable(true) 
        .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 

          trips.remove(position); 
          tripStrings.remove(position); 
          tinyDB.putListString("roadtrips", tripStrings); 

          notifyItemRemoved(position); 
          notifyItemRangeChanged(position, trips.size()); 
         } 
        }).setNegativeButton("Cancel", null) 
        .create().show(); 
      return true; 
     } 
    }); 
+0

setResult()和finish()在这种情况下是未定义的。这是否假设适配器是在活动中定义的?这就是为什么我说我不认为它适用于适配器(否则)。 –

+0

为此,您可以在实例化适配器的同时传递Activity实例,并使用它来调用setResult()和finish()。 –