2017-09-23 70 views
0

我有一个特定的问题。我正在创建一个应用程序,它允许我显示某些菜肴的菜单。我设计了一个包含TextView和RatingBar的自定义适配器。所以在我的其他Activity(ViewDatabase)中,我从JSON-File(方法名为showData)中检索碟名,并将其显示在获取自定义适配器的ListView中。Android - 如何处理单个ListViewItem中的多个元素?

我现在的问题是,不知道为什么我只能选择我的菜的名称(所以我的适配器的textview)或评级栏(也在我的适配器)。

我试图把方法:myListView.setItemsCanFocus(true);但仍然没有工作。

我没有实现一个clicklistener我的文本在适配器?我试图实现one.I需要一个明确的意图交换活动,但我不能 从一个Adapterclass转到其他类的意图。

在ViewDatabse-类是onItemClick我改变活动如果我点击文本的方法。

这里是我的代码:

  • 适配器:

一)

public UserInformationAdapter(Context context, List<UserInformation> objects) { 
    super(context, R.layout.rating_item, objects); 
    this.context = context; 
    table = objects; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 

    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.rating_item, null); 
    } 

    TextView name = (TextView) v.findViewById(R.id.hauptgerichte); 
    RatingBar ratingBar = (RatingBar) v.findViewById(R.id.rate_bar); 

    UserInformation userInformation = table.get(position); 


    ratingBar.setOnRatingBarChangeListener(onRatingChangedListener(position)); 

    ratingBar.setTag(position); 
    ratingBar.setRating(getItem(position).getRatingStar()); 

    name.setText(userInformation.getName()); 

    name.setTag(position); 
    return v; 
} 

private RatingBar.OnRatingBarChangeListener onRatingChangedListener(final int position) { 
    return new RatingBar.OnRatingBarChangeListener() { 
     @Override 
     public void onRatingChanged(RatingBar ratingBar, float v, boolean b) { 
      UserInformation item = getItem(position); 
      assert item != null; 
      item.setRatingStar(v); 
      Log.i("Adapter", "star: " + v); 
     } 
    }; 
} 

}

这是项目(名称和的RatingBar):

公共类UserInformation {

private String name; 
private float ratingStar; 


public UserInformation(){ 

} 

public String getName() { 
    return name; 
} 


public void setName(String name) { 
    this.name = name; 
} 

void setRatingStar(float ratingStar) { 
    this.ratingStar = ratingStar; 
} 

float getRatingStar() { 
    return 0; 
} 


    @Override 
public String toString(){ 
    return name; 
} 

}

这是检索名称的活动:

  • 活动:

公共类ViewDatabase延伸AppCompatActivity {

private static final String TAG = "ViewDatabase"; 
private FirebaseDatabase mFirebaseDatabase; 
private FirebaseAuth mAuth; 
private FirebaseAuth.AuthStateListener mAuthListener; 
private DatabaseReference myRef; 
private String userID; 
private ArrayList<String> array; 

private final List<UserInformation> arr = new ArrayList<>(); 
private UserInformationAdapter adapter2; 

private ListView mListView; 




@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.view_database_layout); 

    array = new ArrayList<>(); 
    mListView = (ListView) findViewById(R.id.list_karnivoure); 
    mListView.setItemsCanFocus(true); 


    mAuth = FirebaseAuth.getInstance(); 
    mFirebaseDatabase = FirebaseDatabase.getInstance(); 
    myRef = mFirebaseDatabase.getReference(); 


    FirebaseUser user = mAuth.getCurrentUser(); 
    userID = user.getUid(); 





    myRef.child("shakes").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // This method is called once with the initial value and again 
      // whenever data at this location is updated. 
      showData(dataSnapshot); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

private void showData(DataSnapshot dataSnapshot) { 

    Iterable<DataSnapshot> children = dataSnapshot.getChildren(); 

    for (DataSnapshot child: children){ 

     UserInformation uInfo = child.getValue(UserInformation.class); 
     arr.add(uInfo); 

     adapter2 = new UserInformationAdapter(ViewDatabase.this, arr); 

     mListView.setAdapter(adapter2); 
     mListView.setItemsCanFocus(true); 

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

       mListView.setItemsCanFocus(true); 
       Object listItem = mListView.getItemAtPosition(position); 
       Intent i = new Intent(ViewDatabase.this,KarnivoureInput.class); 
       i.putExtra("name", listItem.toString()); 
       startActivity(i); 
      } 
     }); 

    } 

回答

0

https://stackoverflow.com/a/8955441/5608931

尝试添加该attribue到TextViewRatingBar。这将是可点击的,但不会得到专注

android:focusable="false" 
+0

这个dowsnt为我工作。我想主要的问题是我没有一个点击侦听器在我的适配器textView。我不知道如何为textView完全添加一个。我在ViewDatabase类中实现了一个Click Listener,该类中包含“onItemClick”,它为我提供了整个项目的clicklsitener。这个“onItemClick”返回列表视图中的菜名,并将其提供给另一个活动。我怎么能在customAdapter中实现这个意图? –

相关问题