2015-10-09 2 views
0

Мне нужна помощь, чтобы сохранить рейтинг баров рейтинга в моем списке для каждого элемента. Мой вопрос: как я могу это сделать, потому что OnItemClickListener не работает. это как мой пользовательский адаптер массив выглядитКак сохранить рейтинг бара рейтинга в виде списка

public class CustomArrayAdapter extends ArrayAdapter<String> { 
public ArrayList<String> ratings; 
private Activity context; 
private int[] imageID; 
private String[] stdName; 
private double[] GPA; 
private String[] course; 
private String[] rollNo; 
public float cRating; 

public CustomArrayAdapter(Activity context, int[] imageID, String[] stdName, double[] GPA, String[] course, String[] rollNo) { 
    super(context, R.layout.row_design, stdName); 
    this.context = context; 
    this.imageID = imageID; 
    this.stdName = stdName; 
    this.GPA = GPA; 
    this.course = course; 
    this.rollNo = rollNo; 
} 

static class ViewContainer 
{ 
    public ImageView stdImage; 
    public ImageView possibleImage; 
    public TextView primaryTV; 
    public TextView secondryTV; 
    public RatingBar ratingBar; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ViewContainer viewContainer; 
    View rowView = convertView; 
    if(rowView == null) { 
     //converting the XML file into view objects 
     LayoutInflater inflater = context.getLayoutInflater(); 
     rowView = inflater.inflate(R.layout.row_design, null, true); 
     viewContainer = new ViewContainer(); 

     //getting the refrence of widgets 
     viewContainer.stdImage = (ImageView) rowView.findViewById(R.id.student_image); 
     viewContainer.possibleImage = (ImageView) rowView.findViewById(R.id.possibility_image); 
     viewContainer.primaryTV = (TextView) rowView.findViewById(R.id.primary_text_view); 
     viewContainer.secondryTV = (TextView) rowView.findViewById(R.id.secondry_text_view); 
     viewContainer.ratingBar = (RatingBar) rowView.findViewById(R.id.rating_bar); 


     rowView.setTag(viewContainer); 
    } else { 
     viewContainer = (ViewContainer) rowView.getTag(); 
     viewContainer.ratingBar.setRating(0.0f); 
     rowView.setBackground(null); 
    } 
    viewContainer.ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { 
     @Override 
     public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { 
      cRating = rating; 
     } 
    }); 
    //setting the possible values to widgets 
    viewContainer.stdImage.setImageResource(imageID[position]); 
    viewContainer.primaryTV.setText(stdName[position] + " (GPA:" + GPA[position] + ")"); 
    viewContainer.secondryTV.setText(course[position] + " (RollNo:" + rollNo[position] + ")"); 

    if (GPA[position] < 3.0) { 
     rowView.setBackgroundResource(android.R.color.holo_red_light); 
     viewContainer.possibleImage.setImageResource(R.drawable.cross_small); 
    } else { 
     viewContainer.possibleImage.setImageResource(R.drawable.tick_small); 
    } 

    return rowView; 
} 

}

и это моя деятельность, где я хочу, чтобы получить рейтинг

public class StudentSelectionActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_student_selection); 
    //getting the refrence of list view 
    ListView listView = (ListView) findViewById(R.id.list); 
    //creating object of Rating activity to access it's public instances 
    final MainActivity obj = new MainActivity(); 
    //creating custom adapter 
    final CustomArrayAdapter adapter = new CustomArrayAdapter(this, obj.imageID, obj.stdName, obj.GPA, obj.course, obj.rollNo); 
    listView.setAdapter(adapter); 
    //handling events on click listener of list view 
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Toast.makeText(StudentSelectionActivity.this, "rating = " + adapter.cRating, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 


@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_selected_students, menu); 
    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); 
} 

}

ответ

0

Создать Entry класс , Этот класс содержит ваши атрибуты, например cRating. Затем удлините CustomArrayAdapter для ArrayAdapter<Entry> вместо ArrayAdapter<String>. Измените конструктор, чтобы что-то вроде этого

public CustomArrayAdapter(Context context, int layoutResourceID, List<Entry> listItems) { 
    super(context, layoutResourceID, listItems); 
    this.context = context; 
    this.itemList = listItems; 
    this.layoutResID = layoutResourceID; 
} 

В вашем методе GetView использовать

EventDetailEntry item = this.itemList.get(position); 

, чтобы получить соответствующий пункт. Используйте этот пункт, чтобы установить cRating. Тогда ваш метод onItemClicked должен работать должным образом. Надеюсь, что это достаточно ясно.

1

Ваш setOnItemClickListener не работал для адаптера, так как вы используете другой адаптер для адаптера с интерактивным доступом. Таким образом, один из вариантов заключается в использовании класса адаптера click listener внутри.

Как

rowView.setOnClickListener(new View.onClickListener() 
{ 
//Perform your operation. 

}); 
+0

Но опять же возникает вопрос, как может знать, что на какой позиции рейтинга был установлен/изменен, не используя OnItemClickListener .because с помощью этого я могу быть уверен в позиции –

+0

вы используете rowView. setOnClickListener внутри вид адаптера, так что вы также знаете позицию, она такая же, как и позиция getView. – theLazyFinder

+0

Отлично, получилось :) –

Смежные вопросы