2017-12-07 4 views
4

Ich habe eine einfache Frage. Ich habe eine Liste von SeekBar. Meine Anforderung ist, wenn der Benutzer die erste SeekBar auf 70% zieht, sollte die nächste bei 30% stoppen. Wie kann ich SeekBar Fortschritt auf einen bestimmten Wert oder% in meinem Fall stoppen?Wie kann der Suchleisten-Fortschritt auf einem bestimmten Level gestoppt werden?

public class ProductsAdapter extends BaseAdapter { 
    private ArrayList<Products> list; 
    //private LayoutInflater layoutInflater; 
    private int shelfShareSum; 
    private int remainingShelfShare; 
    private static HashMap<String, Integer> shelfShareValues = new HashMap<String, Integer>(); 
    private HashMap<Integer, Integer> productShelfShareMap = new HashMap<Integer, Integer>(); 
    private Context con; 
    private SQLiteDatabase database; 
    private SQLiteOpenHelper dbHelper; 
    //SparseIntArray seekbarValuePos = new SparseIntArray(); 

    public ProductsAdapter(Context context, ArrayList<Products> list){ 
     this.list = list; 
     //layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     dbHelper = new DBHelper(context); 
     database = dbHelper.getWritableDatabase(); 
     this.con = context; 
    } 

    @Override 
    public int getCount() { 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     final shelfShareHolder holder; 
     if (row == null){ 

      LayoutInflater mInflater = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = mInflater.inflate(R.layout.shelf_share_list_view, null); 
      holder = new shelfShareHolder(); 
      holder.productTextView = (TextView) row.findViewById(R.id.shelfShareProductTextView); 
      holder.percentTextView = (TextView) row.findViewById(R.id.seekbarValue); 
      holder.shelfShareSeekbar = (SeekBar) row.findViewById(R.id.seekBar1); 
      row.setTag(holder); 
     }else { 
      holder = (shelfShareHolder) row.getTag(); 
     } 
     Products p = list.get(position); 

      //int pID = p.getProductID(); 
      int prog = p.getSetSlider(); 

      holder.shelfShareSeekbar.setProgress(list.get(position).getSetSlider()); 


     holder.shelfShareSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
       //shelfShareSum = progress; 

       holder.percentTextView.setText(String.valueOf(progress)); 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
       remainingShelfShare = 100 - shelfShareSum; 
       Integer preV = productShelfShareMap.get(((Products)list.get(position)).getProductID()); 
       if(preV == null){ 
        holder.shelfShareSeekbar.setMax(remainingShelfShare); 
       }else { 
        holder.shelfShareSeekbar.setMax(Integer.parseInt(holder.percentTextView.getText().toString()) + remainingShelfShare); 
       } 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
        /*shelfShareSum +=Integer.parseInt(seekBarValue.getText().toString()); 
        Log.i("SUM", "onStopTrackingTouch: "+shelfShareSum); 
        seekBar.setMax(shelfShareSum);*/ 
       list.get(position).setSetSlider(seekBar.getProgress()); 
       shelfShareSum = 0; 
       //remainingShelfShare = 100; 

       productShelfShareMap.put(((Products)list.get(position)).getProductID(), Integer.parseInt(holder.percentTextView.getText().toString())); 
       for (HashMap.Entry<Integer, Integer> entry : productShelfShareMap.entrySet()){ 

        shelfShareSum += entry.getValue(); 

       } 

       shelfShareValues.put(((Products)list.get(position)).getShelfShareID()+"-"+((Products)list.get(position)).getProductID(), Integer.parseInt(holder.percentTextView.getText().toString())); 
       //shelfShareValues.put(((Products)list.get(position)).getShelfShareID()+"-"+((Products)list.get(position)).getCategoryID(), Integer.parseInt(holder.percentTextView.getText().toString())+"-"+((Products)list.get(position)).getProductID()); 
       //Info.getInstance().setShelfSharePercent(shelfShareValues); 

      } 
     }); 
     holder.productTextView.setText(((Products)list.get(position)).getProductName()); 

     return row; 
    } 

    public static HashMap<String, Integer> sendshelfShareValuesMap(){ 
     return shelfShareValues; 
    } 

    private static class shelfShareHolder{ 
     TextView productTextView; 
     SeekBar shelfShareSeekbar; 
     TextView percentTextView; 
    } 

} 
+0

zeigen uns Ihren Code, so kann ich Ihnen helfen –

+0

bitte einen Blick @WaleedAsim haben – 3iL

+0

Kann Benutzer später 30% seekbar auf einen anderen Wert ändern? – azizbekian

Antwort

1

Um dieses Verhalten zu haben, können wir einen Zeiger haben, den Wert haben wird, dass, wie viel% any seekbar links kann max bis gehen. Und das kann bei jedem Ziehen aktualisiert werden.

Für die untenstehende Demo gehe ich davon aus, welche Fortschrittswerte wir vom Server bekommen, ist richtig, wie Sie mir gesagt haben.

ProgressModel.java: Eine Pojo-Klasse zum Speichern von Fortschrittsinformationen.

public class ProgressModel { 

    //default value set to zero 
    public int progress = 0; 
} 

ListAdapter.java: Eine Dummy-Adapter-Klasse, die alle Elemente mit dem erforderlichen Fortschritt Logik anpassen.

public class ListAdapter extends ArrayAdapter<ProgressModel> { 

    private Context mContext; 
    private ArrayList<ProgressModel> mProgressModels; 
    //set default to 100. 
    private int currentMaxProgress = 100; 


    public void setCurrentMaxProgress(int progress) { 
     currentMaxProgress = progress; 
    } 

    public ListAdapter(Context context, ArrayList<ProgressModel> progressModels) { 
     super(context, R.layout.list_item, progressModels); 
     mContext = context; 
     mProgressModels = progressModels; 
    } 

    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
     ViewHolder holder = new ViewHolder(); 
     if (convertView == null) { 
      convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false); 
      holder.seekBar = convertView.findViewById(R.id.seekBar); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     final ProgressModel progressModel = mProgressModels.get(position); 

     holder.seekBar.setProgress(progressModel.progress); 


     final ViewHolder finalHolder = holder; 
     holder.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean b) { 
       //check how much percentage user has dragged and if it exceeds the max limit, show a warning message, and send the seekbar back to its position 
       if (progress - progressModel.progress > currentMaxProgress) { 
        finalHolder.seekBar.setProgress(progressModel.progress); 
        Toast.makeText(mContext, "Cant go beyond " + currentMaxProgress + "%", Toast.LENGTH_LONG).show(); 
       } else { 
        progressModel.progress = progress; 
        notifyDataSetChanged(); 
        updateCurrentMaxProgress(); 
       } 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 
     }); 

     return convertView; 
    } 

    //update the currentMaxProgress by iterating over whole array 
    private void updateCurrentMaxProgress() { 
     int totalProgress = 0; 
     for(int i = 0; i < mProgressModels.size(); i++){ 

      totalProgress = totalProgress + mProgressModels.get(i).progress; 
     } 
     setCurrentMaxProgress(100 - totalProgress); 
    } 

    public static class ViewHolder { 
     SeekBar seekBar; 
    } 

} 

MainActivity.java:

public class MainActivity extends AppCompatActivity { 

    ListAdapter mListAdapter; 
    ArrayList<ProgressModel> mProgressModels = new ArrayList<>(); 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ListView mListView = findViewById(R.id.list_view); 
     mListAdapter = new ListAdapter(this, mProgressModels); 
     mListView.setAdapter(mListAdapter); 
     loadDataFromServer(); 
    } 

    //assuming from server side it'll always be correct. 
    public void loadDataFromServer(){ 
     int totalProgress = 0; 
     for(int i = 1; i<=4; i++){ 
      int progress = i * 10; 
      ProgressModel progressModel = new ProgressModel(); 
      progressModel.progress = progress; 
      mProgressModels.add(progressModel); 
      totalProgress = totalProgress + progress; 
     } 
     mListAdapter.setCurrentMaxProgress(100 - totalProgress); 
     mListAdapter.notifyDataSetChanged(); 
    } 


} 
+0

Ihr Code in onProgressChange Ereignis hat das Ding für mich getan. Vielen Dank! :) – 3iL

+0

Gern geschehen :) – TheLittleNaruto

Verwandte Themen