Android QQ 개인 태그 추가 및 삭제 기능 모방

8079 단어 Android라벨
최근 회사 프로젝트 개발 에 있어 서 QQ 개인 태그 와 유사 한 수요 가 있 습 니 다.구체 적 으로 개인 태그 의 추가,삭제,추가 과정 에서 중복 되 는 태 그 는 사용자 에 게 추가 할 수 없 음 을 알려 줍 니 다.먼저 효과 도 를 보 여 드 리 겠 습 니 다.

탭 단 추 를 누 르 면 탭 이 선택 한 페이지 를 팝 업 하고 모든 탭 을 표시 합 니 다.모든 탭 에 있 는 item 을 누 르 면 선택 한 탭 이 위 에 표 시 됩 니 다.같은 탭 을 다시 클릭 하여 추가 하면'탭 이 존재 합 니 다.다시 추가 하 십시오'를 알려 줍 니 다.위 에서 선택 한 탭 을 클릭 하여 삭제 작업 을 진행 합 니 다.
업무 논 리 는 바로 이렇다.다음은 구체 적 인 실현 과정 이다.
1.인터페이스 레이아웃:

<LinearLayout
  android:layout_width="fill_parent"
  android:layout_height="@dimen/label_hei" >

  <GridView
   android:id="@+id/label_check_gv"
   style="@style/w_h_full"
   android:layout_margin="@dimen/margin"
   android:horizontalSpacing="@dimen/margin"
   android:numColumns="4"
   android:scrollbars="none"
   android:stretchMode="columnWidth"
   android:verticalSpacing="@dimen/margin" >
  </GridView>
 </LinearLayout>

 <LinearLayout
  android:layout_width="fill_parent"
  android:layout_height="@dimen/activity_bar"
  android:background="@color/gray_bg" >

  <TextView
   style="@style/w_wrap_h_wrap"
   android:layout_gravity="center_vertical"
   android:layout_marginLeft="@dimen/margin"
   android:text="@string/all_label" />
 </LinearLayout>

 <GridView
  android:id="@+id/label_gv"
  style="@style/w_h_full"
  android:layout_margin="@dimen/margin"
  android:horizontalSpacing="@dimen/margin"
  android:numColumns="4"
  android:scrollbars="none"
  android:stretchMode="columnWidth"
  android:verticalSpacing="@dimen/margin" >
</GridView>
관건 적 인 레이아웃 은 바로 두 개의 Gridview 입 니 다.그 중에서 속성 은 ID,높이,너비,거리,수평 거리,열 수,스크롤 바 를 숨 기 고 크기 조정 과 열 너비 크기 가 동기 화 되 며 수직 거리 입 니 다.item 의 레이아웃 은 textview 입 니 다.배경 은 사용자 정의 테두리 입 니 다.
2.Gridview 어댑터:

public class FragLabelGridViewAdapter extends BaseAdapter {

 class ViewHolder {
  @ViewInject(R.id.gv_label_txt)
  public TextView label;
 }

 private Context context;
 private LayoutInflater inflater;
 private List<String> labels;

 public FragLabelGridViewAdapter(List<String> labels, Context context) {
  this.context = context;
  inflater = LayoutInflater.from(context);
  this.labels = labels;

 }

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

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

 @Override
 public long getItemId(int id) {
  // TODO Auto-generated method stub
  return id;
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder viewHolder;
  if (convertView == null) {
   convertView = inflater.inflate(R.layout.gv_item_label, null);
   viewHolder = new ViewHolder();
   ViewUtils.inject(viewHolder, convertView);
   convertView.setTag(viewHolder);
  } else {
   viewHolder = (ViewHolder) convertView.getTag();
  }
  viewHolder.label.setText(labels.get(position));
  return convertView;
 }

}

핵심 은 viewHolder 를 사용 하여 Gridview 를 최적화 하 는 것 입 니 다.원 리 는 convertView 의 재 활용 입 니 다.convertView 대상 을 처음 만 들 었 을 때 item 의 하위 View 컨트롤 대상 을 예화 하여 ViewHolder 대상 에 저장 합 니 다.그리고 convertView 의 setTag 로 viewHolder 대상 을 Tag 에 설정 합 니 다.나중에 ListView 의 item 을 다시 불 러 올 때 Tag 에서 ViewHolder 대상 을 직접 꺼 낼 수 있 습 니 다.매번 item 의 하위 컨트롤 대상 을 가 져 올 필요 가 없습니다.이렇게 복용 의 목적 을 달성 하여 성능 을 크게 향상 시 켰 다.
3.메 인 인터페이스의 코드:

public class FragmentLabel extends Fragment {

 @ViewInject(R.id.label_gv)
 GridView labelGridview;
 @ViewInject(R.id.label_check_gv)
 GridView labelCheckGridview;
 private Context context;
 private FragLabelGridViewAdapter adapter;
 private FragLabelCheckGridViewAdapter checkAdapter;
 //     
 private List<String> labels = new ArrayList<String>();
 //     
 private List<String> checkLabels = new ArrayList<String>();

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {

  View view = inflater.inflate(R.layout.fragment_label, container, false);
  ViewUtils.inject(this, view);
  context = getActivity().getApplicationContext();
  return view;

 }

 @Override
 public void onActivityCreated(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onActivityCreated(savedInstanceState);
  initviews();
 }
우선 주 해 를 통 해 구성 요소 의 성명 을 진행 합 니 다.효 과 는 findviewbyid()와 같 습 니 다.그 다음 에 두 개의 Gridview 어댑터 의 성명 입 니 다.그 다음은 Gridview 의 데 이 터 를 모 의 해서 조작 하 는 것 입 니 다.

private void initviews() {
  labels.add("   ");
  labels.add("   ");
  labels.add("  ");
  labels.add("  ");
  labels.add("   ");
  labels.add("   ");
  labels.add("  ");
  labels.add("  ");
  labels.add("  ");
  labels.add("   ");
  labels.add("  ");
  labels.add("   ");
  labels.add("  ");
  labels.add("  ");
  labels.add("   ");
  labels.add("   ");
  labels.add("   ");
  labels.add("  ");
  labels.add("  ");
  labels.add("   ");
  labels.add("   ");
  labels.add("   ");
  labels.add("  ");

  adapter = new FragLabelGridViewAdapter(labels, context);
  labelGridview.setAdapter(adapter);
  labelGridview.setOnItemClickListener(new OnItemClickListener() {

   @Override
   public void onItemClick(AdapterView<?> arg0, View arg1,
     int position, long arg3) {
    for (int i = 0; i < checkLabels.size(); i++) {
     if (labels.get(position) == checkLabels.get(i)) {
      UiUtil.showToast(context,
        getResources().getString(R.string.label_toast));
      return;
     }

    }
    checkLabels.add(labels.get(position));

    refresh();
   }

  });
  checkAdapter = new FragLabelCheckGridViewAdapter(checkLabels, context);
  labelCheckGridview.setAdapter(checkAdapter);
  labelCheckGridview.setOnItemClickListener(new OnItemClickListener() {

   @Override
   public void onItemClick(AdapterView<?> arg0, View arg1,
     int position, long arg3) {
    checkLabels.remove(position);
    refresh();
   }
  });

 }

 private void refresh() {
  checkAdapter.setLabels(checkLabels);
  checkAdapter.notifyDataSetChanged();
 }
}
우선 list 집합 에 데 이 터 를 추가 합 니 다.여 기 는 모두 아 날로 그 데이터 이 고 실제 상황 데 이 터 는 서버 에서 가 져 옵 니 다.구조 방법 을 통 해 두 개의 매개 변 수 를 전달 하여 어댑터 를 예화 시 키 고 Gridview 에 어댑터 를 연결 합 니 다.
아래 Gridview 의 item 바 인 딩 모니터 에 추가 작업 을 처리 합 니 다.이벤트 에서 탭 의 유일 성 을 판단 하려 면 먼저 Gridview 의 list 집합 을 누 르 십시오.item 을 누 른 값 과 같 으 면'탭 존재'를 알려 주 고 탭 이 존재 하지 않 으 면 위 에 있 는 Gridview 의 list 에 데 이 터 를 추가 합 니 다.마지막 으로 refresh 방법 을 실행 하여 adapter 에 데 이 터 를 전달 한 다음 notify DataSetChanged()방법 을 호출 합 니 다.이렇게 선택 한 탭 은 자동 으로 위 에 나타 나 고 새로 고침 작업 이 필요 없습니다.
위의 Gridview 의 item 바 인 딩 모니터 에 삭제 작업 을 처리 하고 list 의 reove(position)방법 을 호출 합 니 다.삭제 방법 이 실 행 된 후에 새로 고침 방법 을 호출 합 니 다.마지막 으로 실행 되 는 효 과 는 처음 그림 과 같 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기