Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 由getAdapterPosition引起的问题_Android_Android Recyclerview - Fatal编程技术网

Android 由getAdapterPosition引起的问题

Android 由getAdapterPosition引起的问题,android,android-recyclerview,Android,Android Recyclerview,我有一个数组,它包含像{seat 1,seat 1,seat 1,seat 2,seat 2,seat 3,seat 4,seat 4}这样的值。图片的左边 我需要根据其座位值(即图像右侧)对它们进行分组。 对于给定的环境,座位列表数组将是:{1,-1,-1,2,-1,3,4,-1,-1} 目前我正在使用recyclerview并检查以下情况: if(seat_list.get(holder.getAdapterPosition()).equals("-1")) { L

我有一个数组,它包含像{seat 1,seat 1,seat 1,seat 2,seat 2,seat 3,seat 4,seat 4}这样的值。图片的左边 我需要根据其座位值(即图像右侧)对它们进行分组。

对于给定的环境,座位列表数组将是:{1,-1,-1,2,-1,3,4,-1,-1} 目前我正在使用recyclerview并检查以下情况:

if(seat_list.get(holder.getAdapterPosition()).equals("-1"))
    {
        Log.d("aaa", "if :" + seat_list.get(holder.getAdapterPosition()) );
    }
    else
    {
        Log.d("aaa", "else :" + seat_list.get(holder.getAdapterPosition()) );
        holder.ll_header.setVisibility(View.VISIBLE);
        holder.tv_seat_num.setText(seat_list.get(holder.getAdapterPosition()));
    }
上面的代码列表在滚动recyclerview时被破坏。
我已经排序了,但我想给所有订单提供相同座位的公共标题或标题。您可以使用集合进行排序。排序方法首先,我认为您的数据还没有准备好显示。所以最好准备一下。 最好有一些类型化的数据模型,其中包含关于座位和订单的信息。哦,你知道吗? 为了保持示例的简单性,我在活动中准备并映射数据,但这对于实际项目来说不是一个好主意。 所以,根据您的描述,我们有一些数组,其中的项可以被复制,它们在数组中的位置是orderId。因此,以另一种方式,我们希望有一些具有键值对的分组结构,其中key->№ 座位和值->订单ID集合。但是最好有一个类,它表示这样的关系,并且有关于上面描述的事情的信息

有了这样的数据,仅仅在recyclerView中显示它们并不是什么大问题

一开始,我只想在这里放置两个方法,但后来我意识到如果没有完整的代码列表,它可能会很混乱。 所以,给你所有的东西。 这是您将通过以下代码获得的结果:

===是时候看一些代码了====

活动->仅在xml布局中使用RecyclerView

public class SeatsActivity extends AppCompatActivity {
RecyclerView recycler;
SeatsAdapter seatsAdapter;
final String[] orders =
  { "seat 1", "seat 1", "seat 1", "seat 2", "seat 2", "seat 3", "seat 4", "seat 4", "seat 4" };

@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_seats);
  setTitle("Seats example");
  recycler = (RecyclerView) findViewById(R.id.recycler);
  recycler.setLayoutManager(new LinearLayoutManager(this));

  final Map<String, List<Integer>> groupedOrders = groupData(orders);
  final List<SeatItem> seats = mapToSeatsItems(groupedOrders);

  bindToRecycler(seats);
}

private void bindToRecycler(List<SeatItem> seatItems) {
  seatsAdapter = new SeatsAdapter(seatItems);
  recycler.setAdapter(seatsAdapter);
}

private Map<String, List<Integer>> groupData(final String[] items) {
final Map<String, List<Integer>> grouped = new LinkedHashMap<>();

for (int i = 0; i < items.length ; i++) {
  // I took it from your description. I image that orderId is the place of the seat in array
  final Integer orderId = i+1;
  final String headerKey = items[i];

  if (!grouped.containsKey(headerKey)){
    List<Integer> list = new ArrayList<>();
    list.add(orderId);
    grouped.put(headerKey, list);
  } else {
    List<Integer> list = grouped.get(headerKey);
    list.add(orderId);
  }
}

  return grouped;
}

private List<SeatItem> mapToSeatsItems(Map<String, List<Integer>> groupOrders) {
  final List<SeatItem> list = new ArrayList<>(groupOrders.size());
  for (String key : groupOrders.keySet()) {
    final SeatItem item = new SeatItem(key, groupOrders.get(key));
    list.add(item);
  }
  return list;
  }
}
然后是SeatItem,表示数据模型POJO、Bean等等

public class SeatItem {
  public SeatItem(String header, List<Integer> orderIds) {
    this.header = header;
    this.orderIds = orderIds;
  }

  final String header;
  final List<Integer> orderIds;

  public String getHeader() {
    return header;
  }

  public List<Integer> getOrderIds() {
    return orderIds;
  }
}
SeatAdapter->

public class SeatsAdapter extends 
RecyclerView.Adapter<RecyclerView.ViewHolder> {
final List<SeatItem> dataList;

  public SeatsAdapter(final List<SeatItem> items){
  dataList = items;
}

@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup 
parent, int viewType) {
  final View view = 
LayoutInflater.from(parent.getContext()).inflate(R.layout.item_seat, parent, 
false);
  return new SeatsViewHolder(view);
}

@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int 
position) {
  final SeatsViewHolder seatsViewHolder = (SeatsViewHolder) holder;
  final SeatItem item = dataList.get(holder.getAdapterPosition());

  final StringBuilder contentBuilder = new StringBuilder();
  for (int i = 0; i < item.getOrderIds().size(); i++) {
    // here is not production ready, but for just example will be ok
    contentBuilder
        .append("order Id: ")
        .append(item.getOrderIds().get(i));
    if (i + 1 != item.getOrderIds().size()){
      contentBuilder.append("\n");
    }
  }
  seatsViewHolder.tvHeader.setText(item.getHeader());
  seatsViewHolder.tvContent.setText(contentBuilder);
}

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

private static class SeatsViewHolder extends RecyclerView.ViewHolder {
  final TextView tvHeader;
  final TextView tvContent;

  SeatsViewHolder(View itemView) {
    super(itemView);
    tvHeader = (TextView) itemView.findViewById(R.id.tvHeader);
    tvContent = (TextView) itemView.findViewById(R.id.tvContent);
  }
}
}
最后一个一项xml将由recycler显示

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

<TextView
    android:id="@+id/tvHeader"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:text="header! "
    android:textAppearance="@style/TextAppearance.AppCompat.Title"
    android:padding="8dp"
    android:background="#cccccc"

    />

<TextView
    android:id="@+id/tvContent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:text="content ! ! ! "
    android:layout_gravity="top"
    android:gravity="top"
    android:textAppearance="@style/TextAppearance.AppCompat.Medium"
    android:padding="8dp"
    />

</LinearLayout>

我已经分类了,但我想给所有相同座位的订单提供通用标题或标题你可以看看@Kaushik我不想将标题添加到回收器视图。。。特定项目将有标题。请参见图片右侧。列表是否很大?有多大?只需做一个for循环来创建另一个列表,然后在适配器中使用它。这是一个非常简单的问题,但您的问题不太清楚,可以使用recyclerview来完成。只需发布您的实际数组列表,我就可以hlp您。@VladymyrRtmnko:bounty仅供努力:。。。一旦我当前执行此代码,我将认为正确: