'프로그래밍노트/Java_Android'에 해당되는 글 5건

  1. 2017.03.20 Java replace 함수
  2. 2016.10.11 ListView adapter 오류 : 뒷 부분이 반복된다? (1)
  3. 2016.08.13 파일 불러오는 함수! (1)
  4. 2016.08.12 안드로이드에서 파일 저장하는 함수!
  5. 2016.08.11 Toolbar에 아이콘 추가하기

replace("원래 문자", "바꿀 문자");

String str = "Hello world!";

String tmp = str.replace("Hello", "yellow");


tmp 값 출력시 "yellow world!" 로 출력됨.

신고
Posted by icaynia

안드로이드에서 ListView를 사용하던 중에 원하지 않는 결과가 나왔다.



위는 실행시킨 후 정상적인 모습이다. 하지만...



아래쪽으로 스크롤해보니 이상하게 반복되었다.



다시 올려봤다. 뒷부분이 반복되는것 뿐만 아니라 이렇게 데이터가 꼬이기도 한다.

그리고 디자인도 오류다..



위처럼 실행 시킨 코드 중에, Custom Adapter중 getView 함수에 문제가 있었다.
내가 짠 잘못된 커스텀 Adapter의 코드는 다음과 같다. 

@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
final Context context = parent.getContext();
if ( convertView == null ) {
LayoutInflater inflater = (LayoutInflater) context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_wordview, parent, false);

ViewHolder vh = new ViewHolder();

vh.korean = (TextView) convertView.findViewById(R.id.korean);
vh.word = (TextView) convertView.findViewById(R.id.wordtx);
vh.hiragana = (TextView) convertView.findViewById(R.id.hiraganatx);

convertView.setTag(vh);

word n = m_List.get(position);
if (n != null) {
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.korean.setText(n.korean);
holder.word.setText(n.word);
holder.hiragana.setText(n.hiragana);
}
}



getView 함수 중 convertView라는 것이 있다. 이 convertView는 ListView의 성능 향상을 위해 재활용되기도 한다.

5번째 줄 if 문에서, convertView == null 일 경우 실행하는 코드가 있다. 어플리케이션을 시작하고 나서 이 함수가 처음 실행될 때, convertView는 null이다. 즉 convertView에 view를 추가해 줘야 한다.

그런데, 그 후에는 convertView가 null이 아니다. 내가 저질러버린 실수는 converView가 null인 경우 모든 것을 실행해버리고, 재활용되어 null이 아닌 경우는 아무것도 실행을 하지 않는다.


@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
final Context context = parent.getContext();
if ( convertView == null ) {
LayoutInflater inflater = (LayoutInflater) context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_wordview, parent, false);
}
ViewHolder vh = new ViewHolder();

vh.korean = (TextView) convertView.findViewById(R.id.korean);
vh.word = (TextView) convertView.findViewById(R.id.wordtx);
vh.hiragana = (TextView) convertView.findViewById(R.id.hiraganatx);

convertView.setTag(vh);

word n = m_List.get(position);
if (n != null) {
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.korean.setText(n.korean);
holder.word.setText(n.word);
holder.hiragana.setText(n.hiragana);
}

단순히 if문을 닫는 위치만 바꾸어 줬다. 






신고
Posted by icaynia

public String loadFile(String FileName) {
String dirPath = "/sdcard/test";
File file = new File(dirPath);
String content = "";
String initword = "파일이 없음";

if( !file.exists() ) {
file.mkdirs();
return initword;
}

if ( file.listFiles() != null ) {
for (File f : file.listFiles()) {
String str = FileName;
Log.v(null, "fileName : " + str);
String loadPath = dirPath + "/" + str;
try {
FileInputStream fis = new FileInputStream(loadPath);
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(fis));

String temp = "";
while ((temp = bufferReader.readLine()) != null) {
content += temp;
}
Log.v(null, "" + content.toString());


} catch (Exception e) {

}

}
} else {
}
return content;
}

코드는 내가 봐도 마음에 안 들지만 일단 작동하기에 대충 메모만 해 둡니다.

담에 바꾸는 걸로 해야지.

신고
Posted by icaynia

MainActivity든 다른 액티비티나 클래스이든 Java파일에서:

public void saveFile(String FileName, String str) {

String dirPath = "/sdcard/testname";
File file = new File(dirPath);
if( !file.exists() ) {
file.mkdirs();
}
String testStr = str;

File savefile = new File(dirPath+"/"+FileName);
try{
FileOutputStream fos = new FileOutputStream(savefile);
fos.write(testStr.getBytes());
fos.close();
} catch(IOException e){}
}

AndroidMainfest.xml 의 <mainfest>안에 넣을 것.


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />


코드 리팩토링 전혀 안된 메모용 코드이다...

신고
Posted by icaynia


위처럼 아이콘 버튼을 추가하는 방법입니다.


MainActivity.java


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scrolling);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(getResources().getDrawable(android.R.drawable.ic_menu_save));

toolbar.setNavigationIcon(getResources().getDrawable(android.R.drawab.아이콘이름));


주의할 점은 setSupportActionBar(toolbar); 아래줄에 넣어야 합니다.

신고
Posted by icaynia